home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / visulztn / saoimage / saoimage.lha / editemcs.c < prev    next >
C/C++ Source or Header  |  1990-04-20  |  4KB  |  162 lines

  1. #ifndef lint
  2. static char SccsId[] = "%W%  %G%";
  3. #endif
  4.  
  5. /* Module:    editemcs.c (Editor Emacs)
  6.  * Purpose:    Provide EMACS like response for popup line editor
  7.  * Subroutine:    emacs_response()        returns: int
  8.  * Xlib calls:    XLookupString()
  9.  * Copyright:    1989 Smithsonian Astrophysical Observatory
  10.  *        You may do anything you like with this file except remove
  11.  *        this copyright.  The Smithsonian Astrophysical Observatory
  12.  *        makes no representations about the suitability of this
  13.  *        software for any purpose.  It is provided "as is" without
  14.  *        express or implied warranty.
  15.  * Modified:    {0} Michael VanHilst    initial version          4 July 1989
  16.  *        {n} <who> -- <does what> -- <when>
  17.  */
  18.  
  19. #include <X11/Xlib.h>
  20. #include <X11/Xutil.h>
  21. #include <X11/keysym.h>
  22. #include <X11/keysymdef.h>
  23. #include "hfiles/edit.h"
  24.  
  25. #define MAX_MAPPED_STRING_LENGTH 16
  26. #define MetaMask Mod1Mask
  27.  
  28. /*
  29.  * Subroutine:    emacs_response
  30.  * Purpose:    Respond to keys in emacs fashion
  31.  * Returns:    1 on event indicating entry, -1 on cancel, else 0
  32.  * Xlib calls:    XLookupString()
  33.  */
  34. int emacs_response ( xkey, edit )
  35.      XKeyEvent *xkey;
  36.      EditStruct *edit;
  37. {
  38.   KeySym keysym;
  39.   XComposeStatus compose;
  40.   int char_cnt;
  41.   static int escape = 0;
  42.   static int bufsize = MAX_MAPPED_STRING_LENGTH;
  43.   char buffer[MAX_MAPPED_STRING_LENGTH];
  44.   void place_edit_cursor(), move_edit_cursor(), clear_edit_buf();
  45.   void delete_chars_forward(), delete_chars_backward(), insert_chars();
  46.   void store_edit_struct(), recall_edit_struct(), draw_new_string();
  47.   int next_word_end(), last_word_start();
  48.  
  49.   /* decode the key event to ascii */
  50.   char_cnt = XLookupString(xkey, buffer, bufsize, &keysym, &compose);
  51.   /* ignore modifier key pressing */
  52.   if( (keysym >= XK_Shift_L) && (keysym <= XK_Hyper_R) )
  53.     return( 0 );
  54.   /* escape char ignores modifiers */
  55.   if( (xkey->state & MetaMask) || escape ) {
  56.     escape = 0;
  57.     switch( keysym ) {
  58.     case XK_d:
  59.     case XK_D:
  60.       delete_chars_forward(edit, next_word_end(edit));
  61.       break;
  62.     case XK_f:
  63.     case XK_F:
  64.       move_edit_cursor(edit, next_word_end(edit));
  65.       break;
  66.     case XK_b:
  67.     case XK_B:
  68.       move_edit_cursor(edit, last_word_start(edit));
  69.     default:
  70.       return( 0 );
  71.     }
  72.   } else if( (xkey->state & ControlMask) || (keysym >= 0xF000) ) {
  73.     /* check for control function */
  74.     if( (xkey->state & ControlMask) && ((keysym < XK_A) || (keysym > XK_z)) )
  75.       return( 0 );
  76.     if( (keysym >= 0xF000) && (xkey->state & (ControlMask | MetaMask)) )
  77.       return( 0 );
  78.     switch( keysym ) {
  79.     case XK_A:
  80.     case XK_a:
  81.     case XK_Begin:
  82.       place_edit_cursor(edit, 0);
  83.       break;
  84.     case XK_B:
  85.     case XK_b:
  86.     case XK_BackSpace:
  87.     case XK_Left:
  88.       move_edit_cursor(edit, -1);
  89.       break;
  90.     case XK_C:
  91.     case XK_c:
  92.       /* restore the string to how we started, then exit */
  93.       recall_edit_struct(edit, 0, 1);
  94.       return( -1 );
  95.     case XK_D:
  96.     case XK_d:
  97.       delete_chars_forward(edit, 1);
  98.       break;
  99.     case XK_E:
  100.     case XK_e:
  101.     case XK_End:
  102.       place_edit_cursor(edit, edit->char_cnt);
  103.       break;
  104.     case XK_F:
  105.     case XK_f:
  106.     case XK_Right:
  107.       move_edit_cursor(edit, 1);
  108.       break;
  109.     case XK_G:
  110.     case XK_g:
  111.       escape = 0;
  112.       break;
  113.     case XK_K:
  114.     case XK_k:
  115.       delete_chars_forward(edit, edit->char_cnt - edit->active_position);
  116.       break;
  117.     case XK_P:
  118.     case XK_p:
  119.     case XK_Up:
  120.     case XK_Prior:
  121.       recall_edit_struct(edit, edit->stack_index + 1, 0);
  122.       draw_new_string(edit, 1);
  123.       break;
  124.     case XK_N:
  125.     case XK_n:
  126.     case XK_Next:
  127.       recall_edit_struct(edit, edit->stack_index - 1, 1);
  128.       draw_new_string(edit, 1);
  129.       break;
  130.     case XK_Down:
  131.       recall_edit_struct(edit, edit->stack_index - 1, 0);
  132.       draw_new_string(edit, 1);
  133.       break;
  134.     case XK_T:
  135.     case XK_t:
  136.       break;
  137.     case XK_Tab:
  138.       break;
  139.     case XK_Clear:
  140.       clear_edit_buf(edit);
  141.       draw_new_string(edit, 1);
  142.       break;
  143.     case XK_Linefeed:
  144.     case XK_Return:
  145.       if( edit->char_cnt > 0 )
  146.     store_edit_struct(edit);
  147.       return( 1 );
  148.     case XK_Escape:
  149.       escape = 1;
  150.       break;
  151.     case XK_Delete:
  152.       delete_chars_backward(edit, 1);
  153.       break;
  154.     default:
  155.       break;
  156.     }
  157.   } else if( (char_cnt > 0) && (buffer[0] >= ' ') ) {
  158.     insert_chars(edit, buffer, char_cnt);
  159.   }
  160.   return( 0 );
  161. }
  162.